<?php
/**
 * Created by PhpStorm.
 * User: weiwei
 * Date: 2020-03-21
 * Time: 11:55
 */

namespace service;

use TencentIm\Application;

/**
 * Class TencentIm
 * @package service
 * 本类是基于halobear/tencent-im进行封装的腾讯IM接口，在使用前请安装依赖
 */
class TencentIm{
    protected static $app = null;

    /**
     * TencentIm constructor.
     * @param $admin_id
     * @param $app_id
     * @param $app_secret
     */
    public function __construct($admin_id,$app_id,$app_secret){

        self::$app = new Application([
            'identifier'=>$admin_id,
            'app_id'=> $app_id,
            'app_secret'=> $app_secret
        ]);
    }

    /**
     * 获取user_sig
     * @param string $identifier 账号
     * @param float|int $expiry_after 失效时间 60 * 60 * 24 * 360 一年
     * @return string
     */
    public function user_sig($identifier='',$expiry_after= 86400 * 360){
        if(!$identifier){
            return '账号必填';
        }
        $token = self::$app->credential->generate_user_sig($identifier,$expiry_after);
        return $token;
    }

    /**
     * 用户在线状态
     * @param array $account_ids 查询的用户ID
     * @return array|\GuzzleHttp\Psr7\Response
     */
    public function user_status($account_ids = []){
        $result = self::$app->user->get_user_status($account_ids);
        return $result;
    }

    /**
     * @param string $group_name 群名称
     * @param string $owner_id 群主id, 自动添加到群成员中.如果不填，则群没有群主
     * @param string $group_type 群类型, 包括Public(公开群), Private(私密群), ChatRoom(聊天室)
     * @return array
     */
    public function create_group($group_name,$owner_id,$group_type='ChatRoom'){
        $result = self::$app->group->group_create_group($group_type,$group_name,$owner_id);
        return  $result;
    }

    /**
     * @param string $group_id 要操作的群组id
     * @param string $account_id 要导入的用户id
     * @param string $nickname 要导入的用户昵称
     * @param string $role 要导入的用户的身份(现可填值只有Admin)，不填默认为Member
     * @return array
     */
    public function user_import($group_id,$account_id,$nickname,$role='Admin'){
        $rsp = self::$app->auth->account_import($account_id,$nickname);
        $result = self::$app->group->group_import_group_member($group_id,$account_id,$role);
        return ['import'=>$rsp,'group'=>$result];
    }

    /**
     * @param string $group_id 要操作的群组id
     * @return array
     */
    public function destroy_group($group_id){
        $result = self::$app->group->group_destroy_group($group_id);
        return $result;
    }

    /**
     * @param string $group_id 要操作的群组id
     * @param string $account_id 要操作的用户id
     * @param int $silence 是否静默删除, 0为否，1为是
     * @return array
     */
    public function destroy_group_member($group_id,$account_id,$silence=1){
        $result = self::$app->group->group_delete_group_member($group_id,$account_id,$silence);
        return $result;
    }

    /**
     * @param string $group_id 要操作的群组id
     * @param string $account_id 要操作的用户id
     * @param string $role 要修改的用户的身份(现可填值只有Admin)，不填默认为Member, 为null则不改变成员身份
     * @param string $msg_flag    消息屏蔽类型,比如AcceptAndNotify(接收并提示), 为null则不改变屏蔽类型
     * @param int $shutup_time 需禁言时间，单位为秒，0表示取消禁言
     * @return array
     */
    public function modify_group_member($group_id,$account_id,$role=null,$msg_flag=null,$shutup_time=0){
        $result = self::$app->group->group_modify_group_member_info2($group_id,$account_id,$role,$msg_flag,$shutup_time);
        return $result;
    }

    /**
     * @param string $group_id 需要修改基础信息的群组的 ID
     * @param string $group_name 群名称，最长30字节
     * @param string $introduction 群简介，最长240字节
     * @param string $notification 群公告，最长300字节
     * @param string $face_url 群头像 URL，最长100字节
     * @param int $max_member_num 最大群成员数量，最大为6000
     * @param string $apply_join 申请加群处理方式。包含 FreeAccess（自由加入），NeedPermission（需要验证），DisableApply（禁止加群）
     * @return array
     */
    public function modify_group_info($group_id,$group_name='',$introduction='',$notification='',$face_url='',$max_member_num=500,$apply_join='NeedPermission'){
        $info_set=[
            'introduction' => $introduction,
            'notification' => $notification,
            'face_url' => $face_url,
            'max_member_num' => $max_member_num,
            'apply_join' => $apply_join
        ];
        $result = self::$app->group->group_modify_group_base_info2($group_id,$group_name,$info_set,[]);
        return $result;
    }

    /**
     * @param string $account_id 发消息的用户id
     * @param string $group_id 要操作的群组id
     * @param string $text 消息内容
     * @return array
     */
    public function send_message($account_id,$group_id,$text){
        $result = self::$app->group->group_send_group_msg($account_id,$group_id,$text);
        return $result;
    }

    /**
     * @param string $account_id 发送消息的用户
     * @param string $group_id 群组id
     * @param string $pic_path 要发送图片的本地路径
     * @return array
     */
    public function send_pic($account_id,$group_id,$pic_path){
        $result = self::$app->group->group_send_group_msg_pic($account_id,$group_id,$pic_path);
        return $result;
    }

    /**
     * 在某一群组发系统消息
     * @param string $group_id    群组id
     * @param string $content     系统通知内容，支持二进制数组
     * @param string $receiver_id 接收者群成员id，为空表示全员下发
     * @return array
     */
    public function send_system($group_id,$content,$receiver_id){
        $result = self::$app->group->group_send_group_system_notification($group_id,$content,$receiver_id);
        return $result;
    }

    /**
     * 批量禁言/取消禁言
     * @param string $group_id  群组id
     * @param string $member_id 要禁言/取消禁言 的用户
     * @param int $type 类型,1禁言,0取消禁言
     * @param int $second    表示禁言多少秒, 0
     * @return array 通过解析REST接口json返回包得到的关联数组，包含该用户在某个群的身份(如果成功), 成功与否、错误提示等字段
     */
    public function forbid_send_msg($group_id, $member_id, $type=1,$second=86400){
        if(!$type){
            $second = 0;
        }
        $result = self::$app->group->group_forbid_send_msg($group_id,$member_id,$second);
        return $result;
    }

    /**
     * 全局禁言
     * @param string $account_id 设置禁言配置的帐号
     * @param int $c2c_time 单聊消息禁言时间，单位为秒，非负整数，最大值为4294967295,等于0代表取消帐号禁言；最大值4294967295代表帐号被设置永久禁言；
     * @param int $group_time 群组消息禁言时间，单位为秒，非负整数，最大值为4294967295,等于0代表取消帐号禁言；最大值4294967295代表帐号被设置永久禁言；
     * @return array|\GuzzleHttp\Psr7\Response
     */
    public function setnospeaking($account_id,$c2c_time=86400,$group_time=86400){
        #构造新消息
        $msg = [
            'Set_Account'           => $account_id,
            'C2CmsgNospeakingTime'           => $c2c_time,
            'GroupmsgNospeakingTime'           => $group_time,
        ];
        $result = self::$app->group->httpPostJson('v4/openconfigsvr/setnospeaking',$msg);
        return $result;
    }

    /**
     * 查询全局禁言
     * @param string $account_id 查询禁言信息的帐号
     * @return array|\GuzzleHttp\Psr7\Response
     */
    public function getnospeaking($account_id){
        $msg = [
            'Get_Account' => $account_id
        ];
        $result = self::$app->group->httpPostJson('v4/openconfigsvr/getnospeaking',$msg);
        return $result;
    }

    /**
     * 检查自有帐号是否已导入即时通信 IM
     * @param array $account_ids 请求检查的帐号对象数组，单次请求最多支持100个帐号
     * @return array|\GuzzleHttp\Psr7\Response
     */
    public function account_check($account_ids=[]){
        $CheckItem = [];
        foreach ($account_ids as $v) {
            array_push($CheckItem,[
                'UserID'=>$v
            ]);
        }
        $msg = [
            'CheckItem' => $CheckItem
        ];
        $result = self::$app->group->httpPostJson('v4/im_open_login_svc/account_check',$msg);
        return $result;
    }

    /**
     * 本接口适用于将 App 用户帐号的登录态（如 UserSig）失效。
     * @param string $account_id 用户账号
     * @return array|\GuzzleHttp\Psr7\Response
     */
    public function kick($account_id){
        $msg = [
            'Identifier' => $account_id
        ];
        $result = self::$app->group->httpPostJson('v4/im_open_login_svc/kick',$msg);
        return $result;
    }

    /**
     * 帐号删除
     * 仅支持删除体验版帐号。帐号删除时，该用户的关系链、资料等数据也会被删除。帐号删除后，该用户的数据将无法恢复，请谨慎使用该接口。
     * @param array $account_ids 请求删除的帐号对象数组，单次请求最多支持100个帐号
     * @return array|\GuzzleHttp\Psr7\Response
     */
    public function account_delete($account_ids=[]){
        $CheckItem = [];
        foreach ($account_ids as $v) {
            array_push($CheckItem,[
                'UserID'=>$v
            ]);
        }
        $msg = [
            'DeleteItem' => $CheckItem
        ];
        $result = self::$app->group->httpPostJson('v4/im_open_login_svc/account_delete',$msg);
        return $result;
    }

    /**
     * 批量帐号导入
     * @param array $account_ids 用户账号，单个用户名长度不超过32字节，单次最多导入100个
     * @return array|\GuzzleHttp\Psr7\Response
     */
    public function multiaccount_import($account_ids=[]){
        $msg = [
            'Accounts' => $account_ids
        ];
        $result = self::$app->group->httpPostJson('v4/im_open_login_svc/kick',$msg);
        return $result;
    }
}